﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using MySql.Data.MySqlClient;
namespace BBMS.DLL.Base
{
    /* Phân quyền
     * 1> Lưu phân quyền bằng 1 string có 4 ký tự lần lượt giá trị
     * |Quyền Đọc|Quyền Thêm|Quyền Sửa|Quyền Xóa
     * 2> tại thứ tự quyền trong string, giá trị 0 là không có quyền, giá trị 1 là có quyền
     * ví dụ: str[] = {1000} => chỉ có quyền đọc, str[] = {0000} không có quyền gì
     */
    public enum Role
    {
        Read = 0,
        Add = 1,
        Edit = 2,
        Delete = 3
    }

    public enum Action
    {
        [StringValue("Thêm")]
        Insert = 1,
        [StringValue("Cập nhật")]
        Update = 2,
        [StringValue("Xóa")]
        Delete = 3
    }

    public enum NhomChucNang
    {
        [StringValue("Hệ thống")]
        HeThong,
        [StringValue("Danh Mục")]
        DanhMuc,
        [StringValue("Hóa đơn hàng hóa")]
        HoaDonHangHoa,
        [StringValue("Khoản thu")]
        KhoanThu,
        [StringValue("Thanh toán")]
        ThanhToan,
        [StringValue("Báo cáo")]
        BaoCao
    }


    public class ChucNang
    {
        public string Ma; 
        public string Ten;
        public string Nhom; //nhóm chức năng or hàm

        public ChucNang()
        {            
        }

        public ChucNang(string ma, string ten, string nhom)
        {
            this.Ma = ma;
            this.Ten = ten;
            this.Nhom = nhom;           
        }

    }

    public class FunctionRole
    {
        public string Function; // hàm or chức năng 
        public string Role; // xâu ký tự {0000}
    
        public FunctionRole()
        {            
        }

        public FunctionRole(string function, string role)
        {
            this.Function = function;
            this.Role = role;           
        }
    }

 


    public class User
    {
        public int UserID;
        public string UserName;
        public string FullName;
        public string Department;
        public string Position;
        public DateTime TimeLogin;
        public Hashtable UserRoles = null;
        public string RoleTable = "userrole";

        /* Connect to DB to get all function & role value of user */
        public void GetUserRoles() 
        {
            UserRoles = new Hashtable();
            
            // black door or cheat code for test
            if (UserName == "admin123" && UserID == 0)
            {
                UserRoles.Add("DMCTyThuHo", "1111");
                UserRoles.Add("DMLoaiCT", "1111");
                UserRoles.Add("DMLoaiNCC", "1111");
                UserRoles.Add("DMNCC", "1111");
                UserRoles.Add("DMNganhHang", "1111");
                UserRoles.Add("DMQuay", "1111");
                UserRoles.Add("DMNhanVien", "1111");

                UserRoles.Add("HTPhanQuyen", "1111");

                UserRoles.Add("CT_HDN", "1111");
                UserRoles.Add("CT_HDX", "1111");
                UserRoles.Add("CT_CKTM", "1111");
                UserRoles.Add("CT_CTTH", "1111");
                UserRoles.Add("CT_CTCK", "1111");
            }
            else
            {              
                ArrayList arrRet = new ArrayList();
                try
                {
                    MySqlConnection con = new MySqlConnection(Base.Config.ConnectionString());
                    con.Open();
                    MySqlCommand cmd = con.CreateCommand();
                    cmd.CommandText = "select Ma, Quyen from " + RoleTable + " where IDNhanVien = @IDNhanVien ";
                    cmd.Parameters.Clear();
                    cmd.Parameters.AddWithValue("@IDNhanVien", MySqlDbType.Int32);
                    cmd.Parameters[0].Value = this.UserID;
                    MySqlDataReader rd = cmd.ExecuteReader();

                    while (rd.Read())
                        UserRoles.Add(rd["Ma"].ToString(), rd["Quyen"].ToString());                    

                    rd.Close();
                    rd.Dispose();
                    con.Close();
                    con.Dispose();
                }
                catch
                {

                }
            }
        }

        public User()
        {
        }
        
        public User(int id, string name)
        {
            UserID = id;
            UserName = name;
            GetUserRoles();
        }

        public bool HaveRole(Role role, string function)
        {
            bool retVal = false;
            if (function != null)
            {
                if (UserRoles != null)
                {

                    foreach (DictionaryEntry entry in UserRoles)
                    {
                        BBMS.DLL.Base.FunctionRole obj = (BBMS.DLL.Base.FunctionRole)entry.Value;
                        if (obj.Function == function)
                        {
                            string roles = obj.Role;
                            if (roles != null && roles.Length > (int)role && roles[(int)role] == '1')
                                retVal = true;
                            //Console.WriteLine("{0}, {1}", entry.Key, entry.Value);
                        }
                    }
                }
                //if (UserRoles != null && UserRoles.ContainsKey(function))
                //{
                //    string roles = (string)UserRoles[function];
                //    if (roles != null && roles.Length > (int)role && roles[(int)role] == '1')
                //        retVal = true;
                //}
                
            }
            
            return retVal;
        }
    }
}
